﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Loja.Aplicação;
using Loja.Banco;
using Loja.Padrao;
using Loja.Controles.Aplicação;

namespace Loja.Telas
{
    public partial class FormProduto : PadraoCadastro
    {
        private Controle controle;

        private Int32 produto;

        private List<String> codigos = new List<string>();
            
        public FormProduto(Controle controle, Int32 produto_ID)
        {
            this.controle = controle;
            this.produto = produto_ID;
            InitializeComponent();
        }       

        public void PopulaTela()
        {
            ListaTipoProduto();

            if (produto != 0)
            {                
                CarregaProduto();
                BuscaItens();
                ListaBarras();
            }
        }

        public void BuscaItens()
        {

           // txtQtdItens.Text = controle.BuscaQuantidade(produto);
        }

        public void ListaBarras()
        {
            var produtos = controle.ListaBarras(produto);

            foreach (var p in produtos)
            {
                barras.Rows.Add(p.Codigo, p.Valor, p.Unidade, p.Quantidade, "NÃO");
            }

            barras.Refresh();
        }

        public void CarregaProduto()
        {
            var produtos = controle.BuscaProduto(produto);          
            txtCodigo.Text = produtos.Produto_ID.ToString();
            txtDescricao.Text = produtos.Descricao;
            txtCusto.Text = produtos.CustoUnitario.ToString();
            txtEstMinimo.Text = produtos.EstoqueMinimo.ToString();
            txtEstMaximo.Text = produtos.EstoqueMaximo.ToString();
            cbTipoProduto.SelectedValue = produtos.TipoProduto.TipoProduto_ID;
            //dtCadastro.Value = produtos.DataCadastro;
        }

        public void ListaTipoProduto()
        {
            cbTipoProduto.DataSource = controle.BuscaTipoProduto();
            cbTipoProduto.ValueMember = "Código";
            cbTipoProduto.DisplayMember = "Descricao";
        }


        public FormProduto()
        {
            PopulaTela();
        }

        private void btIncluirItem_Click(object sender, EventArgs e)
        {
           // LeituraCodigoBarras form = new LeituraCodigoBarras();
          //  form.ShowDialog(this);
        }

        private void FormProduto_Load(object sender, EventArgs e)
        {
            PopulaTela();
            barras.AllowUserToAddRows = false;
            txtQtdItens.Enabled = false;
            Contar();
            if (txtQtdItens.Text == "")
            {
                txtQtdItens.Text = "0";
            }
        }

        private void btRemoverItem_Click(object sender, EventArgs e)
        {

        }
       
        public void IncluirCodigoBarras() 
        {
            if (txtCodigoBarras.Text != "")
            {
                Boolean tem = false;
                String la = "";

                foreach (String t in codigos)
                {
                    if (t == txtCodigoBarras.Text)
                    {
                       tem = true;
                       la = t;                       
                    }
                }        


                if (PercorreGrid())
                {
                    Contar();
                    //txtQtdItens.Text = Convert.ToString(Convert.ToInt32(txtQtdItens.Text) + 1);
                    txtCodigoBarras.Text = "";
                }
                else
                    if (controle.ExisteCodigoBarras((txtCodigoBarras.Text)))
                    {
                        controle.LimpaParametros();
                        LeituraCodigoBarras leitor = new LeituraCodigoBarras(controle, txtCodigoBarras.Text);                    
                        leitor.ShowDialog(this);
                        if (controle.Codigo != "" && controle.Descricao != "")
                        {
                            var busca = controle.GetBarras();
                            barras.Rows.Add(txtCodigoBarras.Text, busca.Valor, busca.Unidade, busca.Quantidade, "SIM");
                            controle.LimpaParametros();
                            Contar();
                        }
                            txtCodigoBarras.Text = "";
                    }
                    else
                        if (tem == true)
                        {
                            codigos.Remove(la);
                            controle.LimpaParametros();
                            LeituraCodigoBarras leitor = new LeituraCodigoBarras(controle, txtCodigoBarras.Text);
                            leitor.ShowDialog(this);
                            if (controle.Codigo != "" && controle.Descricao != "")
                            {
                                var busca = controle.GetBarras();
                                barras.Rows.Add(txtCodigoBarras.Text, busca.Valor, busca.Unidade, busca.Quantidade, "NÃO");
                                controle.LimpaParametros();
                                Contar();
                            }
                            txtCodigoBarras.Text = "";
                        }
                        else
                        {
                            String nome = controle.BuscaNomeProduto(txtCodigoBarras.Text);
                            MessageBox.Show("Codigo de Barras já relacionado a outro produto ("+nome+")!");
                            txtCodigoBarras.Text = "";
                        }
            }        
        }

        private Boolean PercorreGrid()
        {
            for (Int32 i = 0; i < barras.RowCount; i++)
            {
                if (Convert.ToString(barras.Rows[i].Cells[0].Value) == txtCodigoBarras.Text)
                {
                    barras.Rows[i].Cells[3].Value = (Convert.ToInt32((barras.Rows[i].Cells[3].Value).ToString()) + 1).ToString();
                    return true;                    
                }
            }
            return false;
        }

        private void txtCodigoBarras_Validated(object sender, EventArgs e)
        {
            IncluirCodigoBarras();
            txtCodigoBarras.Focus();
        }

        private void txtEstMinimo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }

        private void txtEstMaximo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }

        private void txtQtdItens_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }

        private void txtCusto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar) && (e.KeyChar == '.'))
            {
                e.Handled = true;
            }
        }

        Int32 edicao = 0;

        private void image_Click(object sender, EventArgs e)
        {
            if (edicao == 0)
            {
                edicao = 1;
                txtQtdItens.Enabled = true;
            }
            else
            {
                edicao = 0;
                txtQtdItens.Enabled = false;
            }

        }

        public Boolean ValidaCampos()
        {
            if (txtDescricao.Text == "")
            {
                MessageBox.Show("Campo de Descrição está invalido!");
                return false;
            }
            else
                if(txtCusto.Text == "")
                {
                    MessageBox.Show("Campo de Custo está invalido!");
                    return false;
                }
                else
                    if (txtEstMinimo.Text == "")
                    {
                        MessageBox.Show("Campo de Estoque Minimo está invalido!");
                        return false;
                    }
                    else
                        if (txtEstMaximo.Text == "")
                        {
                            MessageBox.Show("Campo de Estoque Maximo está invalido!");
                            return false;
                        }
                        else
                          /*  if (txtQtdItens.Text == "")
                            {
                                MessageBox.Show("Campo de Quantidade está invalido!");
                                return false;
                            }
                            else*/
                                return true;
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            if (ValidaCampos())
            {
                if (produto == 0)
                {
                    Produto novoProduto = new Produto();
                    try
                    {
                        novoProduto.Descricao = txtDescricao.Text;
                        novoProduto.CustoUnitario = Convert.ToDecimal(txtCusto.Text);
                        novoProduto.EstoqueMaximo = Convert.ToInt32(txtEstMaximo.Text);
                        novoProduto.EstoqueMinimo = Convert.ToInt32(txtEstMinimo.Text);
                        novoProduto.Desativado = false;
                    }
                    catch
                    {
                        MessageBox.Show("Erro ao armazenar produto!");
                    }

                    if (controle.SalvarNovoProduto(novoProduto, barras, Convert.ToInt32(cbTipoProduto.SelectedValue)))
                    {
                        MessageBox.Show("Produto Salvo!");
                        this.Close();
                    }
                }
                else 
                {
                    Produto novoProduto = controle.BuscaProduto(Convert.ToInt32(txtCodigo.Text));
                     try
                    {
                        novoProduto.Descricao = txtDescricao.Text;
                        novoProduto.CustoUnitario = Convert.ToDecimal(txtCusto.Text);
                        novoProduto.EstoqueMaximo = Convert.ToInt32(txtEstMaximo.Text);
                        novoProduto.EstoqueMinimo = Convert.ToInt32(txtEstMinimo.Text);
                        novoProduto.Desativado = false;
                    }
                    catch
                    {
                        MessageBox.Show("Erro ao armazenar produto!");
                    }
                     if (controle.AlterarProduto(novoProduto, barras, Convert.ToInt32(cbTipoProduto.SelectedValue), codigos))
                     {
                         MessageBox.Show("Produto Salvo!");
                         this.Close();
                     }

                }
            }
        }

        public void DesativarCodigo()
        {
            
        }

        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            try
            {
                if (barras.CurrentRow.Cells[4].Value.ToString() == "SIM")
                {
                    barras.Rows.Remove(barras.CurrentRow);
                    Contar();
                }
                else 
                {
                    codigos.Add(barras.CurrentRow.Cells[0].Value.ToString());
                    barras.Rows.Remove(barras.CurrentRow);
                    Contar();
                }                
            }
            catch
            {
            }
        }

        public void Contar()
        {
            Int32 qt = 0;
            foreach (DataGridViewRow col in barras.Rows)
	        {
                qt = qt + Convert.ToInt32(col.Cells[3].Value);
	        }
            txtQtdItens.Text = qt.ToString();
        }
    }
}
